#include <stdlib.h>
#include "util.h"

/*
  Implementação do algoritmo do crivo de Erastótones
*/
int crivo(int valor){

	int i, j, *vet;
	vet = (int *)malloc((valor + 1)*sizeof(int));

	for(vet[1] = 0, i = 2; i <= valor; i++)
		vet[i] = 1;

	for(i = 2; i <= valor / 2; i++)
		for(j = 2; j <= valor / i; j++)
			vet[i*j] = 0;

	if(vet[valor] == 1)
		return 1;

	return 0;

}

/*
  Transforma letras maiúsculas em minúsculas
*/
int transformaTextos(char *letra){

	if(*letra >= 65 && *letra <= 90){
		*letra = *letra + 32;
		return 1;
		}
	else
	if(*letra >= 97 && *letra <= 122)
		return 1;
	else
		return 0;	
}

/*
  Se a palavra for palíndromo a função retorna a somatória do seu código 
  ASCII, caso contrário retorna 0.
*/
int palim(char* palavra, int tam)
{
  int i,
  asc = 0;

  if(tam == 0)
	  return 0;

  /*
    Somatória até o meio da palavra em caso de palavras de tamanho par,
    para palavras de tamanho ímpar o somatório vai até meio-1.
  */
  for(i = 0; i < tam/2; i++)
  {
	  transformaTextos(&palavra[i]);
	  transformaTextos(&palavra[tam-i-1]);
    if (palavra[i] != palavra[tam-i-1])
      return 0;
    asc += palavra[i]*2;
  }
    
  /*
    Se o tamanho da palavra for ímpar, adiciona o valor do código ASCII do meio
    a somatória, se não retorna a somatória já feita.
  */
  if(tam % 2) 
    return (asc + palavra[1+tam/2]);
  else
    return asc;
}

/*
	Parseia palavras em um bloco de texto
*/
int separaPalavra(char* texto, int *chamadas)
{
    int  i = 0, j = 0, numPalim = 0; 
    char palavra[TAM_PALAVRA];
	
	while (texto[i] != '\0')
    	{
		/*
			Considere apenas caracteres alfanuméricos para as palavras
		*/
        	if (isalpha(texto[i]))
        	{
            		transformaTextos(&texto[i]);
            		palavra[j++] = texto[i];
        	}
        	else /* Se fim de palavra, finaliza o buffer 'palavra' e verifica se é palíndromo */
        	{
            		palavra[j] = '\0';
			(*chamadas)++;
            		if (palim(palavra, j)) 
                		numPalim++;
            		j = 0;
        	}
        	i++;
    	}	
    return numPalim;
}

/*
	Parseia frases em um bloco de texto
*/
int separaFrase(char* texto, int *chamadas)
{
	int i = 0,
	j = 0,
	numPalim = 0;
    	char frase[TAM_FRASE];

    	while (texto[i] != '\0')
    	{
		/*
			Considera apenas caracteres alfanuméricos para a frase
		*/
        	if (isalpha(texto[i]))
        	{
            		transformaTextos(&texto[i]);
            		frase[j++] = texto[i];
        	}
        	else if (texto[i] == '\n' || texto[i] == '!' ||
              	texto[i] == '?'  || texto[i] == ';' ||
              	texto[i] == ':'  || texto[i] == '\r' ) 
        	{
			/* Se identificou fim de frase, finaliza o buffer 'frase' e aplica a função de palíndromo */
            		frase[j] = '\0';
	    		(*chamadas)++;
            		if (palim(frase, j)) 
                		numPalim++;
            		j = 0;
        	}
        	i++;
    	}
    	
	return numPalim;
}
